/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Cliente.Controller;

import Cliente.Entidade.Cliente;
import Cliente.Model.ConsultarPaciente;
import Cliente.View.ConsultaCliente;
import Cliente.util.CalculaRCQ;
import Cliente.util.HabilitarCampos;
import Cliente.util.LimpaCampos;
import Cliente.util.Observable;
import Cliente.util.Observer;
import Cliente.util.SelecionarSexo;
import CommandAlterar.AlterarCommand;
import CommandExcluir.ExcluirCommand;
import Inteface.Log;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ButtonGroup;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Caio Valentim
 */
public class AlterarClientePresenter implements Observable {

    public ConsultaCliente view = new ConsultaCliente();
    private DefaultTableModel tableModel;
    private ListSelectionModel listModel;
    private List<Cliente> clientes;

    public List<Cliente> getClientes() {
        return clientes;
    }
    private ConsultarPaciente consultarcliente = new ConsultarPaciente();
    private SelecionarSexo ss = new SelecionarSexo();
    private ButtonGroup grupo = new ButtonGroup();
    private Log log;

    public Log getLog() {
        return log;
    }
    private LimpaCampos limpaCampos = new LimpaCampos();
    private CalculaRCQ calcularcq;
    private List<Observer> observers = new ArrayList<Observer>();

    public AlterarClientePresenter(final Log log) {
        grupo.add(view.getRadFeminino());
        grupo.add(view.getRadMasculino());

        view.setVisible(true);
        this.log = log;
        defineModelo();
        view.getBtnFechar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                view.dispose();
            }
        });


        view.getBtnPesquisar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                atualizaTabelaNome();

            }
        });

        view.getBtnPesquisaCPF().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                atualizaTabelaCPF();
            }
        });

        view.getBtnAlterar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    executar();
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(view, "Erro ao cadastrar o cliente,verifique se os campos foram preenchidos de forma correta!", "Erro", JOptionPane.ERROR_MESSAGE);
                }
            }
        });

        view.getBtnExcluir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                executeExcluir();             
            }
        });

    }

    private void defineModelo() {

        tableModel = (DefaultTableModel) view.getTblCliente().getModel();
        listModel = view.getTblCliente().getSelectionModel();
        listModel.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (e.getValueIsAdjusting()) {
                    mostraDetalheCliente();
                    HabilitarCampos hc = new HabilitarCampos();
                    hc.habilitaCampos(view.getTxtNome(), view.getTxtAltura(), view.getTxtCintura(), view.getTxtIdade(), view.getTxtPeso(), view.getTxtQuadril(), view.getRadMasculino(), view.getRadFeminino(), view.getFtfCPF());
                    view.getBtnAlterar().setEnabled(true);
                    view.getBtnExcluir().setEnabled(true);
                }
            }
        });
        view.getTblCliente().getColumnModel().getColumn(2).setPreferredWidth(400);
    }
    
    
    private void executeExcluir(){
        ExcluirCommand excluir = new ExcluirCommand(this);
        if (excluir.excluiCliente()==true){
            notifyObservers();
        }
    }

    private void mostraDetalheCliente() {
        if (view.getTblCliente().getSelectedRow() != -1) {
            int indice = view.getTblCliente().getSelectedRow();
            view.getTxtNome().setText(clientes.get(indice).getNome());
            view.getFtfCPF().setText(clientes.get(indice).getCpf());
            view.getTxtAltura().setText(String.valueOf(clientes.get(indice).getAltura()));
            view.getTxtIdade().setText(String.valueOf(clientes.get(indice).getIdade()));
            view.getTxtPeso().setText(String.valueOf(clientes.get(indice).getPeso()));
            if (clientes.get(indice).getSexo().equals("Masculino")) {
                view.getRadMasculino().setSelected(true);
            } else {
                view.getRadFeminino().setSelected(true);
            }
            view.getTxtQuadril().setText(String.valueOf(clientes.get(indice).getQuadril()));
            view.getTxtCintura().setText(String.valueOf(clientes.get(indice).getCintura()));
        } else {
            view.getTxtNome().setText("");
            view.getFtfCPF().setText("");
            view.getTxtAltura().setText("");
            view.getTxtIdade().setText("");
            view.getTxtPeso().setText("");
            view.getRadMasculino().isSelected();
            view.getTxtQuadril().setText("");
            view.getTxtCintura().setText("");
        }
    }

    public String ajustaRCQ() {
        calcularcq = new CalculaRCQ((Double.parseDouble(view.getTxtQuadril().getText())), (Double.parseDouble(view.getTxtCintura().getText())), (Integer.parseInt(view.getTxtIdade().getText())), ss.SelecionaSexo(view.getRadFeminino(), view.getRadMasculino()));
        return calcularcq.calcularRCQ();
    }

    public void organizaTabela() {
        clientes = consultarcliente.listarClientes();
        int numeroLinhas = tableModel.getRowCount();
        for (int i = 0; i < numeroLinhas; i++) {
            tableModel.removeRow(0);
        }
        for (int i = 0; i < clientes.size(); i++) {
            tableModel.insertRow(i, new Object[]{clientes.get(i).getId(), clientes.get(i).getCpf(), clientes.get(i).getNome()});
        }
        limpaCampos.limparCampo(view.getTxtAltura(), view.getTxtCintura(), view.getTxtIdade(), view.getTxtNome(), view.getTxtPeso(), view.getTxtQuadril(), view.getFtfCPF());
    }

    private void executar() {
        AlterarCommand executar = new AlterarCommand(this);
        executar.execute();
    }

    private void atualizaTabelaNome() {
        ConsultarPaciente consultarcliente = new ConsultarPaciente();
        tableModel = (DefaultTableModel) view.getTblCliente().getModel();
        if (view.getTxtPesquisaNome().getText().trim().equals("")) {
            clientes = consultarcliente.listarClientes();
            log.escreverMessage("Listando todos os pacientes");
        } else {
            clientes = consultarcliente.consultaClienteNome(view.getTxtPesquisaNome().getText().trim());
        }
        int numeroLinhas = tableModel.getRowCount();
        for (int i = 0; i < numeroLinhas; i++) {
            tableModel.removeRow(0);
        }
        for (int i = 0; i < clientes.size(); i++) {
            tableModel.insertRow(i, new Object[]{clientes.get(i).getId(), clientes.get(i).getCpf(), clientes.get(i).getNome()});
        }
    }

    private void atualizaTabelaCPF() {
        ConsultarPaciente consultarcliente = new ConsultarPaciente();
        tableModel = (DefaultTableModel) view.getTblCliente().getModel();
        if (view.getFtfPesquisaCPF().getText().trim().length() < 14) {
            JOptionPane.showMessageDialog(view, "Erro informe o CPF completo!", "Erro", JOptionPane.ERROR_MESSAGE);
        } else {
            clientes = consultarcliente.consultaClienteCPF(view.getFtfPesquisaCPF().getText());
        }
        int numeroLinhas = tableModel.getRowCount();
        for (int i = 0; i < numeroLinhas; i++) {
            tableModel.removeRow(0);
        }
        for (int i = 0; i < clientes.size(); i++) {
            tableModel.insertRow(i, new Object[]{clientes.get(i).getId(), clientes.get(i).getCpf(), clientes.get(i).getNome()});
        }
    }


    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer ob : observers) {
            ob.update(-1);
        }
    }
}
